// utils/clientAuth.js
/**
 * 客户端认证工具
 * 主要功能：
 * 1. Token管理：维护扫码端（小程序）的登录态
 *    - 存储和管理 access token 和 refresh token
 *    - 处理 token 的刷新和失效
 * 
 * 2. 身份验证：
 *    - 验证用户提供的手机号或邮箱的真实性
 *    - 通过验证码进行二次确认
 * 
 * 3. 账号管理：
 *    - 使用验证过的手机号或邮箱查询职员账号信息
 *    - 验证账号的有效性和权限
 * 
 * 4. 扫码登录：
 *    - 处理扫码操作和二维码解析
 *    - 验证扫码请求的合法性
 *    - 授权目标应用登录
 *    - 触发服务端生成目标应用的登录凭证
 */

const request = require('./request');
const tokenStorage = require('./tokenStorage');

module.exports = {
  /**
   * 微信小程序 Token 管理相关
   */

  // 获取微信 Token
  getToken() {
    return tokenStorage.getToken();
  },

  // 保存微信 Token
  saveToken(token) {
    tokenStorage.saveToken(token);
  },

  // 清除微信 Token
  clearToken() {
    tokenStorage.clearToken();
    tokenStorage.clearRefreshToken();
  },

  // 统一的登录方法：处理登录和token验证
  async login() {
    try {
      const token = tokenStorage.getToken();
      const loginData = {
        clientType: 'wechat'
      };

      // 如果有token，加入请求中
      if (token) {
        loginData.token = token;
      } else {
        // 无token时，获取微信登录凭证
        const loginResult = await wx.login();
        if (!loginResult.code) {
          throw new Error('Failed to get wx.login code');
        }
        loginData.code = loginResult.code;
      }

      // 调用统一的登录接口
      const res = await request.post('/api/scan_client/login', loginData);

      if (res.code === 200) {
        // 保存新token
        if (res.data.token) {
          tokenStorage.saveToken(res.data.token);
          if (res.data.refreshToken) {
            tokenStorage.saveRefreshToken(res.data.refreshToken);
          }
        }

        // 根据账号状态决定跳转
        if (!res.data.isHasAccount) {
          // 未绑定账号，需要验证手机号/邮箱
          wx.redirectTo({
            url: '/pages/verification/verification'
          });
        } else {
          // 已有账号，直接进入授权页面
          wx.redirectTo({
            url: '/pages/index/index'
          });
        }
        return true;
      }

      return false;
    } catch (error) {
      console.error('Login error:', error);
      return false;
    }
  },



  /**
   * 联系方式验证相关
   */

  // 申请服务端生成验证码，并通过验证的联系方式返回（如手机短信，邮件）
  async sendVerificationCode(type, value) {
    try {
      const res = await request.post('/api/scan_client/verification/request', {
        type,
        value
      });
      return res.data;
    } catch (error) {
      console.error('Send verification code error:', error);
      throw error;
    }
  },

  // 输入收到的验证码，请求服务端进行验证
  async verifyCode(requestId, code) {
    try {
      const res = await request.post('/api/scan_client/verification/verify', {
        requestId,
        code
      });
      return res.data;
    } catch (error) {
      console.error('Verify code error:', error);
      throw error;
    }
  },

  /**
   * 账号相关
   */
  // 请求服务端返回可用账号
  async getAvailableAccounts() {
    try {
      const res = await request.get('/api/scan_client/accounts');
      return res.data;
    } catch (error) {
      console.error('Get accounts error:', error);
      throw error;
    }
  },

  /**
   * 扫码相关
   */
  async validateScan(scanCode) {
    try {
      const res = await request.post('/api/scan_client/scan/validate', { scanCode });
      return res.data;
    } catch (error) {
      console.error('Validate scan error:', error);
      throw error;
    }
  },

  async updateScanStatus(scanId, status) {
    try {
      const res = await request.post('/api/scan_client/scan/status', {
        scanId,
        status
      });
      return res.data;
    } catch (error) {
      console.error('Update scan status error:', error);
      throw error;
    }
  },

  async authorizeScan(scanId, accountId) {
    try {
      const res = await request.post('/api/scan_client/scan/authorize', {
        scanId,
        accountId
      });
      return res.data;
    } catch (error) {
      console.error('Authorize scan error:', error);
      throw error;
    }
  }
};
